package visiopuce.service;

import java.util.Date;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import visiopuce.ApplicationContexte;
import visiopuce.HibernateUtil;
import visiopuce.DAO.AnalyseDAOImpl;
import visiopuce.DAO.CotationDAO;
import visiopuce.DAO.CotationDAOImpl;
import visiopuce.DAO.HistoriqueDAO;
import visiopuce.DAO.HistoriqueDAOImpl;
import visiopuce.DAO.PrelevementDAOImpl;
import visiopuce.objets.Analyse;
import visiopuce.objets.Cotation;
import visiopuce.objets.Historique;
import visiopuce.objets.Prelevement;

public class CotationServiceImpl implements CotationService {

	private static final Log log = LogFactory.getLog(CotationService.class);

	private CotationDAO cotationDAO = CotationDAOImpl.getInstance();
	private HistoriqueDAO historiqueDAO = HistoriqueDAOImpl.getInstance();

	/** Constructeur priv� */
	private CotationServiceImpl() {
	}

	/** Instance unique non pr�initialis�e */
	private static CotationServiceImpl INSTANCE = null;

	/** Point d'acc�s pour l'instance unique du singleton */
	public static CotationService getInstance() {
		if (INSTANCE == null) {
			INSTANCE = new CotationServiceImpl();
		}
		return INSTANCE;
	}

	public List<Cotation> getCotationByidPersonne(Integer idPersonne) {
		List<Cotation> cotations = null;

		HibernateUtil.beginTransaction();
		cotations = cotationDAO.getCotationByidPersonne(idPersonne);
		HibernateUtil.commitTransaction();
		HibernateUtil.closeSession();
		return cotations;
	}

	public void deleteAllByidPersonne(Integer idPersonne) {
		try {
			HibernateUtil.beginTransaction();
			cotationDAO.deleteAllByidPersonne(idPersonne);

			Historique h = new Historique();
			h.setDate(new Date());
			h.setRequete("Suppression des cotations de  " + idPersonne);
			h.setUtilisateur(ApplicationContexte.getInstance().getUtilisateur());
			historiqueDAO.save(h);
			HibernateUtil.commitTransaction();
		} catch (Exception ex) {
			ex.printStackTrace();
			HibernateUtil.rollbackTransaction();
		} finally {
			HibernateUtil.closeSession();
		}
	}

	public void save(Cotation cotation) {
		boolean aClore = false;
		if (!HibernateUtil.getSession().getTransaction().isActive()) {
			HibernateUtil.beginTransaction();
			aClore = true;
		}
		try {
			if (cotation.getAnalyse() != null) {
				if (cotation.getPrelevement() == null) {
					Analyse ana = AnalyseDAOImpl.getInstance().findByID(Analyse.class, cotation.getAnalyse().getIdAnalyse());
					cotation.setPrelevement(ana.getPrelevement());
				}

			}
			if (cotation.getPrelevement() != null) {
				if (cotation.getPersonne() == null) {
					Prelevement p = PrelevementDAOImpl.getInstance().findByID(Prelevement.class, cotation.getPrelevement().getIdPrelevement());
					cotation.setPersonne(p.getPersonne());
				}
			}
			cotationDAO.save(cotation);
			Historique h = new Historique();
			h.setDate(new Date());
			h.setRequete("Enregistrement " + cotation.toString());
			h.setUtilisateur(ApplicationContexte.getInstance().getUtilisateur());
			historiqueDAO.save(h);

			if (aClore) {
				HibernateUtil.commitTransaction();
			}
		} catch (Exception ex) {
			if (aClore) {
				ex.printStackTrace();
				HibernateUtil.rollbackTransaction();
			}
		} finally {
			if (aClore) {
				HibernateUtil.closeSession();
			}
		}
	}

	@Override
	public List<Cotation> getCotationByPrelevementAndLibelle(Integer idPrelevement, String cot) {
		List<Cotation> cotations = null;

		HibernateUtil.beginTransaction();
		cotations = cotationDAO.getCotationByPrelevementAndLibelle(idPrelevement, cot);
		HibernateUtil.commitTransaction();
		HibernateUtil.closeSession();
		return cotations;
	}

	@Override
	public List<Cotation> getCotationByAnnee(int annee) {
		List<Cotation> cotations = null;

		HibernateUtil.beginTransaction();
		cotations = cotationDAO.getCotationByAnnee(annee);
		HibernateUtil.commitTransaction();
		HibernateUtil.closeSession();
		return cotations;
	}

	@Override
	public List<Cotation> getCotationByNumSejour(String numSejour) {
		List<Cotation> cotations = null;

		HibernateUtil.beginTransaction();
		cotations = cotationDAO.getCotationByNumSejour(numSejour);
		HibernateUtil.commitTransaction();
		HibernateUtil.closeSession();
		return cotations;
	}
	

	@Override
	public List<Cotation> getCotationByNumSejourNonEnvoyee(String numSejour) {
		List<Cotation> cotations = null;

		HibernateUtil.beginTransaction();
		cotations = cotationDAO.getCotationByNumSejourNonEnvoyee(numSejour);
		
		
		
		
		HibernateUtil.commitTransaction();
		HibernateUtil.closeSession();
		return cotations;
	}

}